#ifndef AST_OPERATORUNARY
#define AST_OPERATORUNARY
#include <string>
#include "node.h"

namespace AST {

    /**
     * Operador Unário
     *
     * Um operador unário é uma estrutura aritmética representada por um
     * elemento e que utiliza somente um operando, independente se possui
     * prioridade à esquerda ou direita.
     *
     * @category AST
     * @package  AST
     */
    class OperatorUnary : public Node {

    private:

        /**
         * Conteúdo Representante
         */
        std::string* _content;

        /**
         * Operando Utilizado
         */
        Node* _operand;

        /**
         * Configuração de Conteúdo
         *
         * Durante o processamento do conteúdo de entrada e análise léxica, o
         * operador unário é representado por um conteúdo que deve ser informado
         * em tempo de construção e é configurado por este método.
         *
         * @param  std::string*   Conteúdo Capturado pelo Token
         * @return OperatorUnary* Próprio Objeto para Encadeamento
         */
        OperatorUnary* _setContent(std::string*);

        /**
         * Operando Utilizado
         *
         * Um operador aritmético unário recebe como parâmetro somente um
         * operando, que deve ser informado em tempo de construção de objeto e
         * configurado por este método.
         *
         * @param  Node*          Operando Utilizado
         * @return OperatorUnary* Próprio Objeto para Encadeamento
         */
        OperatorUnary* _setOperand(Node*);

    public:

        /**
         * Construtor Padrão
         *
         * Método utilizado para construção de instância de operadores unários
         * encontrados durante a criação da árvore abstrata de sintaxe. Durante
         * a construção é necessária a apresentação do conteúdo capturado pelo
         * Token e do operando utilizado.
         *
         * @param std::string* Conteúdo Capturado pelo Token
         * @param Node*        Operando Utilizado
         */
        OperatorUnary(std::string*, Node*);

        /**
         * Apresentação de Conteúdo
         *
         * O conteúdo capturado pelo Token e configurado em tempo de construção
         * do objeto pode ser apresentado utilizando este método posteriormente.
         *
         * @return std::string Conteúdo Configurado
         */
        std::string* getContent();

        /**
         * Apresentação de Operando
         *
         * O operando apresentado em tempo de construção do objeto pode ser
         * utilizado posteriormente na execução utilizando este método, que
         * apresenta o ponteiro para o elemento.
         *
         * @return Node* Elemento Configurado
         */
        Node* getOperand();

        // Sobrescrita
        std::string toString(int);

        // Sobrescrita
        Node* check();

    };

};

#endif

